typeof
를 가졍하기Pick Utility Type을 직접 구현하자.
type Pick<T, K extends keyof T> = {
[key in K]: T[key] // key: typeof T[key]
}
Readonly Utility Type을 직접 구현하자.
제너릭 T의 속성을 모두 readonly로 다시 지정. 🤔 오브젝트의 경우 freeze 이용해야 하지 않을까?
type MyReadonly<T> = {
readonly [key in keyof T]: T[key];
}
Tuple을 Object로 변환하자
type의 형태를 구조적으로 이용할 수 있다.
T[number]
에 대해 더 알아보기. 조건부 타입
type TupleToObject<T extends readonly any[]> = {
[e in T[number]]: e
}
배열 T
의 첫번째 항목의 타입을 반환하는 First<T>
구현하기
type First<T extends any[]> = T extends [] ? never: T[0];
// T extends [number] 이면 T는 숫자 하나를 가진 배열 타입 ex) [1], [2], [3], ...
Tuple이 주어졌을 때 길이를 타입으로 반환하는 타입 구현하기
type Length<T extends any> = T extends readonly any[] ? T['length'] : never;
🤔 readonly
를 빼먹으면 안된다. 왜? Tuple은 타입이 고정되어 있다. readonly any[]
기본 제공 Utility Type인 Exclude<T, U>
를 구현하기
Union Type T
에서 Union Type U
을 빼는 기능
key값을 빼는게 아니다.
type MyExclude<T, U> = T extends U ? never: T;
// 예를 들어 MyExclude<string | number, number> 이렇게 되면
// string extends number -> false -> string
// number extends number -> true -> never
// ...
// 이런식으로 최종 Type이 결정된다
Promise<ExampleType>
에서 ExampleType
을 뽑아내기?
type MyAwaited<T extends Promise<any>> = T extends Promise<infer U>
? (U extends Promise<any> ? MyAwaited<U> : U) // 재귀
: never;
조건 C
가 주어졌을 때 참이면 타입 T
를, 거짓이면 타입 F
를 반환하는 타입, 단 C
는 true
거나 false
type If<C, T, F> = C extends true ? T : F;
Array.concat
을 타입시스템으로 구현하기. 즉, 배열 두개를 붙인 타입을 반환
type Concat<T, U> = T extends [...infer A]
? (U extends [...infer B] ? [...A, ...B] : never)
: never
//혹은
type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]
Array.includes
를 타입시스템으로 구현하기. 반환 타입은 true
혹은 false
가 되어야한다.
type Includes<T extends readonly any[], U> = T extends [infer K, ...infer Rest] ? Equal<U, K> : Includes<Rest, U>
#todo Equal<U, K>
에 대한 설명이 필요함
Array.push
의 제너릭 버전을 구현
type Push<T extends any[], U> = [...T, U];
Array.unshift
의 제너릭 버전을 구현
type Unshift<T extends any[], U> = [U, ...T];
함수가 가진 인자 타입을 구현
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer A) => any ? A : never;
함수에서 ...args
의 타입을 주면된다.